#ifndef MARKDOWNRENDERER_H
#define MARKDOWNRENDERER_H

#include <QObject>
#include <QThread>
#include <QMutex>
#include <QString>
#include <commonmark.h>

/**
 * @brief Markdown渲染器，使用CommonMark库将Markdown文本转换为HTML
 * 支持多线程渲染以避免阻塞UI
 */
class MarkdownRenderer : public QObject
{
    Q_OBJECT

public:
    explicit MarkdownRenderer(QObject *parent = nullptr);
    ~MarkdownRenderer() override;

    /**
     * @brief 渲染Markdown文本
     * @param text Markdown格式的文本
     * @param theme 当前主题（light/dark），用于调整代码高亮样式
     */
    void render(const QString &text, const QString &theme = "light");

    /**
     * @brief 取消当前渲染任务
     */
    void cancel();

signals:
    /**
     * @brief 渲染完成信号
     * @param html 渲染后的HTML文本
     */
    void renderingFinished(const QString &html);

    /**
     * @brief 渲染进度信号
     * @param progress 进度百分比（0-100）
     */
    void renderingProgress(int progress);

    /**
     * @brief 内部信号，用于在工作线程中执行渲染
     */
    void renderInThread(const QString &text, const QString &theme);

private slots:
    /**
     * @brief 在工作线程中执行渲染的槽函数
     */
    void handleRenderInThread(const QString &text, const QString &theme);

private:
    /**
     * @brief 将CommonMark节点转换为HTML
     */
    QString renderNode(cmark_node *node, const QString &theme);

    /**
     * @brief 渲染代码块，添加语法高亮
     */
    QString renderCodeBlock(const QString &text, const QString &language, const QString &theme);

    /**
     * @brief 获取代码高亮的CSS样式
     */
    QString getHighlightCss(const QString &theme);

    /**
     * @brief 初始化HTML模板
     */
    QString initHtmlTemplate(const QString &theme);

    QThread *m_workerThread;      // 工作线程
    QMutex m_mutex;               // 互斥锁，保护共享数据
    bool m_cancelRequested;       // 是否取消渲染
    QString m_currentTheme;       // 当前主题
};

#endif // MARKDOWNRENDERER_H